
//todo **************************** let 命令 **********************************/

//*************** 只在let命令所在的代码块内有效。*************/
{
    let a = 10
    var b = 1
}
// a  //*这里报错
// b

//********************** 代码中，变量i是var命令声明的，在全局范围内都有效，**********************/
//********************** 所以全局只有一个变量i。每一次循环，变量i的值都会发生改变 ******************/
//? *********************所使用let能完美解决  let每一轮循环******************/
var a = []
for (var i = 0; i < 10; i++) {
    a[i] = function () {
        console.log(i)
    }
}
a[6]() // 10

//********************** let 有各自单独的作用域 **********************/
for (let i = 0; i < 3; i++) {
    let i = 'abc'
    console.log(i)
}

//********************** let 不存在变量提升 **********************/
console.log(foo) // 输出undefined
var foo = 2

console.log(bar) // 报错ReferenceError
let bar = 2

//********************** 暂时性死区 **********************/
var tmp = 123
if (true) {
    tmp = 'abc' // ReferenceError
    let tmp
}

//********************** “暂时性死区”也意味着typeof不再是一个百分之百安全的操作。 **********************/
//********************** 如果一个变量根本没有被声明，使用typeof反而不会报错 **********************/
typeof x // ReferenceError
let x
typeof undeclared_variable // "undefined"

//********************** 有些“死区”比较隐蔽，不太容易发现。  **********************/
function bar(x = y, y = 2) {
    return [x, y]
}


//todo **************************** cosnt 命令 **********************************/
//* const只能保证这个指针是固定的（即总是指向另一个固定的地址）
const foo = {};

// 为 foo 添加一个属性，可以成功
foo.prop = 123;
foo.prop // 123

// 将 foo 指向另一个对象，就会报错
foo = {}; // TypeError: "foo" is read-only

